# 1、写函数,将传入的列表或元祖对象的奇数位索引对应的元素
# def ele(obj):
#     result = []
#     for i in range(len(obj)):
#         if i%2!=0:
#             result.append(obj[i])
#     return result
# print(ele([1, 2, 3,4]))
# 2、写函数,判断用户传入的对象(string,list,tuple)长度是否大于5
def len_obj(obj):
    if isinstance(obj,str):
        if len(obj) > 5:
            print(f'传入的字符串:{obj},长度大于5')
        else:
            print((f'掺入的字符串：{obj},长度小于5'))
    if isinstance(obj,list):
        if len(obj) > 5:
            print(f'传入的列表{obj}大于5')
        else:
            print((f'传入的列表{obj}小于5'))
    if isinstance(obj,tuple):
        if len(obj) > 5:
            print(f'传入的元组{obj}大于5')
        else:
            print(f"传入的元组{obj}小于5")
# len_obj([1,2,3,5,6,8,4,4,455])

# 3、写函数,计算传入的string中,数字,字母,空格以及其它内容的个数,并返回结果
def str_num(obj:str):
    shuzi = 0
    zimu = 0
    space =0
    other = 0
    for i in obj:
        if i in '0123456789':
            shuzi +=1
        elif (i >='a' and i <= 'z') or (i >= 'A' and i <= 'Z'):
            zimu += 1
        elif i ==" ":
            space += 1
        else:
            other += 1
    return f"数字的个数为{shuzi},字母的个数为{zimu}，空格的个数为{space}，其他的个数为{other}"


# print(str_num("asdasd  ad5qwe15qw1w*&^^*"))

# 4、写函数,接收两个数字参数,返回较大的那个数字
def max_num(num1:int,num2:int):
    if num1 > num2:
        return num1
    elif num1 < num2:
        return num2
    else:
        return f"两数相等"
# print(max_num(10, 20))
# 5、编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
def cacluate(*args):
    return args
# print(cacluate(11,2,54,8,57,9,))

# 6、编写一个函数, 接收字符串参数, 返回一个元组,元组的第一个值为大写字母的个数, 第二个值为小写字母个数.
def tu_words(str1:str):
    d_zimu = 0
    x_zimu = 0
    for i in str1:
        if i >'a' and i < 'z':
            x_zimu +=1
        if i >'A' and i < 'Z':
            d_zimu += 1
    return d_zimu,x_zimu
# print(tu_words('asdDSSD'))

# 7、编写函数, 接收一个列表(包含30个1~100之间的随机整形数)和一个整形数k, 返回一个新列表.
# 函数需求:
# 将列表下标k之前对应(不包含k)的元素逆序;
# 将下标k及之后的元素逆序;
# def new_list(list1:list,k:int):
#     if len(list1) == 30:
#         k1 = list1[:k][::-1]
#         k2 = list1[k:][::-1]
#         return k1+k2
#     else:
#         return []
# ran_list = [randint(1,100) for i in range(30)]
# 8、编写函数，从键盘输入参数x和n，计算并显示形如x+xx +xxx + xxxx + xxxxx+xxx…xxx+ 的表达式前n项的值
# def _n():
#     x = int(input("请输入x:"))
#     a = x
#     n = int(input("请输入n:"))
#     sum = 0
#     result = []
#     while n > 0:
#         result.append(x)
#         sum += x
#         x = x * 10 + a
#         n -= 1
#     for i in range(len(result)):
#         if result[i] !=result[-1]:
#             print(f"{result[i]}",end="+")
#         else:
#             print(f"{result[i]}={sum}")

# 9、写函数,函数接收的4个参数分别是:姓名,性别(默认为男),年龄,地址
# def info(name,age,address,sex = "男"):
#     print(f"姓名是{name},年龄是{age}，地址是{address}，性别是{sex}")
# info("aa",21,"aa","男")

# 10、写函数,接收n个数字,返回这些数字的和(动态传参)
def n_(*n):
    sum = 0
    for i in n:
        sum +=i
    return sum
# print(n_(1,2,3))
# 11、在实参中传入多个可迭代对象(要有string,list,tuple,set,dict),将每个对象的每个元素都加到args或kwargs里
def iter_obj(*args,**kwagrs):
    print(args)
    print(kwagrs)
# iter_obj(132,456,75,姓名="张三",年龄=21)
# 12、写函数,把传过来的列表中的每一个元素都用"_"拼接,并返回
def ele_(obj:list):
    str1 = ""
    for i in obj:
        str1+=str(i)+"_"
    return str1[:len(str1)-1]
# print(ele_([1,2,3,4]))
# 13、写函数,传入一个数字,返回这个数的阶乘。示例：1x2x3....
def jie(num):
    j = 1
    for i in range(1,num+1):
        j*=i
    return j
# print(jie(5))
# 14、写函数,返回一个扑克牌列表,里面有52项,每一项都是一个tuple
def pk_list():
    p_list = []
    h = ['红桃','黑桃','方片','梅花']
    for j in h:
        for i in [2,3,4,5,6,7,8,9,10,'J','Q','K','A']:
            p_list.append((j,i))
    return p_list
# print(pk_list())
# 15、编写函数，求1+2+3+…N的和
def sum_n(n):
    sum = 0
    for i in range(1,n+1):
        sum+=1
    return f"1+2+3+...的和为:%s"%sum
# 16、编写一个函数，求多个数中的最大值
def max_num1(*n):
    a = n[0]
    for i in n :
        if i > a:
            a = i
    return f"最大数是为：{a}"
# print(max_num1(11,22,33,44,111))
# 17、编写一个函数，提取指定字符串中所有的字母，然后拼接在一起产生一个新的字符串
def new_str(str1:str)->str:
    str2 = ""
    for i in str1:
        if (i >='a' and i <='z') or (i >='A' and i<='Z'):
            str2+=i
    return str2
# print(new_str('sdfjfidasfj6465415'))
# 18、写一个函数，求多个数的平均值
def avg_num(*n):
    return sum(n) / len(n)
# 19、写一个自己的len函数，统计指定序列中元素的个数
def ele_num(ele):
    i = 0
    for j in ele:
        i+=1
    return f"个数为:{i}"
# 20、找出传入的列表或元组的奇数位对应的元素，并返回一个新的列表
def new_list_j(obj):
    result = []
    for i in range(obj):
        if i %2!=0:
            result.append(obj[i])
    return result
# 21、水仙花数：个位、十位、百位的立方加在一起等于数的本身
def s_num():
    # 153   1*1*1 + 5*5*5 + 3*3*3
    for i in range(100,1000):
        if int(str(i)[0]) **3 + int(str(i)[1]) **3 + int(str(i)[2]) **3 == i:
            print(i,end=" ")
s_num()
# 22、 定义函数，有一个形参，传入的是列表，数组大小不超过 100个，
# 数组中的每个元素值不允许超过 100，但是可以等于100，
# 如果列表大小超过了100个截取到第100个为止，要求返回的列表格式：
# 删除所有重复元素，使得每个元素只出现一次
# 按照数字的大小，由高到低排序返回
def list2(list_:list):
    result = []
    for i in list_:
        if i <=100:
            result.append(i)
    result = result[:100]
    result = list(set(result))
    result.sort(reverse=True)
    return result
# 23、定义函数 getLength，打印用户传入的容器类型和数据长度
def getLength(obj):
    if isinstance(obj,list):
        print(f"传入的对象是列表,长度为:{len(obj)}")
    elif isinstance(obj,tuple):
        print(f"传入的对象是元组,长度为:{len(obj)}")
    elif isinstance(obj,set): # 判断类型的
        print(f"传入的对象是集合,长度为:{len(obj)}")
    elif isinstance(obj,dict):
        print(f"传入的对象是字典,长度为:{len(obj)}")
    elif isinstance(obj,str):
        print(f"传入的对象是字符串,长度为:{len(obj)}")
# 24、定义函数 generateNum( )
def generateNum():
    print("定义函数")
# 25、定义函数 moreThan(num)，判断输入的数字是否大于1500
def moreThan(num):
    if num > 1500:
        print(f"传入的{num}大于1500")
    elif num < 1500:
        print(f"传入的{num}小于1500")
    elif num == 1500:
        print(f"传入的{num}等于1500")
# 26、定义函数，有两个形参，第一个形参到第二个形参的范围，所有平方数之和
def ph(a,b):
    sum = 0
    for i in range(a,b+1):
        sum += i**2
    return f"{a}到{b}范围的平方和是:{sum}"
# 27、写函数，检查传入字典的每一个value长度，如果大于2，
# 那么仅保留前两个长度的内容， 并将新内容返回给调用者
def dict_value_2(dict1:dict):
    for key,value in dict1.items():
        try:
            if len(value) >2:
                dict1[key] = value[:2]
        except:
            if len(str(value)) > 2:
                dict1[key] = int(str(value)[:2])
    return dict1
#  28、写函数，判断用户传入的对象（字符串、列表、元组）的元素是否为空
def iftype(obj):
    if obj:
        print("不为空")
    else:
        print("为空")
# 29、编写自定义函数，完成一个简单的减法运算函数
def jian(a,b):
    return a-b

# 30、编写自定义函数，可以输出自己的名字即可。

def name(name):
    print(f"{name}")
# 31、编写自定义函数：剪刀石头布
# 游戏开始，初始状态下用户和电脑都有 100 分，赢一局+10 分，输一局-10 分。
# 当用户为 0 分时，游戏结束，提示游戏结束，比赛输了
# 当用户为 200 分时，游戏结束，提示游戏结束，赢得比赛、每轮比赛都输出当前的分数
# 1 代表剪刀 2 代表石头 3 代表布
def play():
    user = 100
    com = 100
    while True:
        r = int(input("请输入石头剪刀布(1 代表剪刀 2 代表石头 3 代表布):"))
        s = randint(1,3) # 电脑出的
        if user == 200:
            print("你赢了!胜出游戏!")
            break
        elif com == 200:
            print("你输了!退出游戏!")
            break
        if r == 1 and s == 1:
            print("平局!")
            print("玩家还有:%d分数"%user)
            print("电脑还有:%d分数"%com)
        elif r == 1 and s ==2:
            print("你输了!")
            user-=10
            com+=10
            print("玩家还有:%d分数" % user)
            print("电脑还有:%d分数" % com)
        elif r==1 and s ==3:
            print("你赢了!")
            user += 10
            com -= 10
            print("玩家还有:%d分数" % user)
            print("电脑还有:%d分数" % com)
        elif r==2 and s ==1:
            print("你赢了!")
            user += 10
            com -= 10
            print("玩家还有:%d分数" % user)
            print("电脑还有:%d分数" % com)
        elif r==2 and s ==2:
            print("平局!")
            print("玩家还有:%d分数" % user)
            print("电脑还有:%d分数" % com)
        elif r==2 and s==3:
            print("你输了!")
            user -= 10
            com += 10
            print("玩家还有:%d分数" % user)
            print("电脑还有:%d分数" % com)
        elif r==3 and s==1:
            print("你输了!")
            user -= 10
            com += 10
            print("玩家还有:%d分数" % user)
            print("电脑还有:%d分数" % com)
        elif r==3 and s==2:
            print("你赢了!")
            user += 10
            com -= 10
            print("玩家还有:%d分数" % user)
            print("电脑还有:%d分数" % com)
        elif r==3 and s==3:
            print("平局!")
            print("玩家还有:%d分数" % user)
            print("电脑还有:%d分数" % com)
# play()
# 32、编写一个函数，接受一个字符串作为参数，并返回该字符串的逆序字符串
def str1(str2:str):
    return str1[::-1]
# 33、编写一个函数，接受一个数字列表作为参数，并返回其中所有偶数的列表
def str_list(list1:list):
    result = []
    for i in list1:
        if int(i)%2==0:
            result.append(i)
    return result

# 34、编写一个函数，接受一个字符串列表作为参数，并返回其中最长的字符串。
def str_list2(list1:list):
    max_str = list1[0]
    for i in list1:
        if len(i) > len(max_str):
            max_str = i
    return f"最长的字符串时:{max_str}"
# print(str_list2(['abc', 'aaaa', 'asdsa', 'a']))
# 35、编写一个函数，接受一个数字列表作为参数，并返回其中所有数字的平方的总和
def num_list(list1:list)->str:
    sum = 0
    for i in list1:
        sum +=i**2
    return f"所有平方数的和是:{sum}"
# 36、编写一个函数，接受一个字符串作为参数，并返回其中所有单词的首字母的大写形式
def d_str(str1:str)->str:# asdb asd asd qwe
    ne_str = ""
    str_list = str1.split(' ')
    for i in str_list:
        ne_str+=i.capitalize()+" "
    return ne_str
# print(d_str("qwe qdf awdaf fafeqf eg g rh"))
# 37、编写一个函数，接受两个列表作为参数，并返回两个列表的交集
# 举例：
# list1 = [100,200,300,454]
# list2 = [454,789,125,46]
# 返回：[454]
def list_j(list1,list2):
    res = []
    for i in range(len(list1)):
        if list1[i] in list2:
            res.append(list1[i])
    return res
print(list_j([100, 200, 300, 454,555], [454, 789, 125, 46,555]))

#  38、定义一个学生注册函数enroll()，打印学生姓名，性别，年龄，城市
def enroll(姓名,性别,年龄,城市):
    print(f"姓名为:{姓名},性别为:{性别},年龄为:{年龄},城市为:{城市}")
# enroll("张三","男",19,"shenyang")


